#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
#define HMAC_COMMAND_FORMAT "gmssl sm3hmac -key %s -in %s"  
  
int main(int argc, char *argv[]) {  
    if (argc != 4) {  
        fprintf(stderr, "Usage: %s <key_hex> <input_file> <output_file>\n", argv[0]);  
        return EXIT_FAILURE;  
    }  
  
    const char *key_hex = argv[1];    // 密钥的十六进制表示  
    const char *input_file = argv[2]; // 输入文件名  
    const char *output_file = argv[3]; // 输出文件名  
  
    // 构建命令  
    char command[1024]; // 确保命令缓冲区足够大，考虑到文件路径可能较长  
    snprintf(command, sizeof(command), HMAC_COMMAND_FORMAT, key_hex, input_file);  
  
    // 执行命令并捕获输出  
    FILE *fp = popen(command, "r");  
    if (fp == NULL) {  
        perror("popen failed");  
        return EXIT_FAILURE;  
    }  
  
    // 打开输出文件  
    FILE *output_fp = fopen(output_file, "w");  
    if (output_fp == NULL) {  
        perror("fopen output file failed");  
        pclose(fp);  
        return EXIT_FAILURE;  
    }  
  
    // 读取HMAC命令的输出并写入到输出文件  
    char buffer[256]; // 适当增加缓冲区大小以处理可能的较长输出  
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {  
        fputs(buffer, output_fp); // 将输出写入文件  
        printf("%s", buffer); // 同时打印到终端（如果需要）  
    }  
  
    // 关闭文件流  
    if (pclose(fp) == -1) {  
        perror("pclose failed");  
        fclose(output_fp);  
        return EXIT_FAILURE;  
    }  
    if (fclose(output_fp) == EOF) {  
        perror("fclose output file failed");  
        return EXIT_FAILURE;  
    }  
  
    return EXIT_SUCCESS;  
}
